import { SimulateController } from "./Controller";
import { formatTime } from "@/util/common";
import dayjs, { Dayjs } from "dayjs";

export class ClockService {
  /** 仿真时间 */
  simulationTime = '00:00:00.000';
  /** 仿真时间（毫秒值） */
  simulationTimeMs = 0;

  constructor(public controller: SimulateController) { }

  serviceInit() {
    this.clearClock();
  }

  async initClockConfig() {
    this.clearClock();
  }

  /**
   * 清空仿真时钟
   */
  clearClock() {
    this.simulationTime = '00:00:00.000';
    this.simulationTimeMs = 0;
  }

  /**
   * 设置仿真时间
   * 实时时钟：
   * 1、支持相对时间和绝对时间配置
   * 2、不受步骤延迟配置影响
   * 3、除以时钟比率
   * 内部时钟：
   * 1、支持相对时间和绝对时间配置
   * 2、受步骤延迟配置影响
   * 3、不受时钟比率影响
   * @param {number} dateTime - simulation time
   */
  setClockTime(dateTime: number) {
    const simulationConfig = this.controller.simulationConfig;
    this.simulationTimeMs = dateTime;
    let dayjsTime: Dayjs;
    if (simulationConfig.isRelativeTime) {
      dayjsTime = dayjs(dateTime).subtract(8, 'hour');
    } else {
      dayjsTime = dayjs(dateTime);
    }
    this.simulationTime = this.formatTime(dayjsTime.valueOf());
  }

  formatTime(dateTime: number): string {
    const simulationConfig = this.controller.simulationConfig;
    if (simulationConfig.isRelativeTime) {
      // 相对时间从0开始，仅显示时分秒毫秒
      const day = dayjs(dateTime).date() - 1;
      const currentTime = formatTime(dateTime, "HH:mm:ss.SSS");
      // 判断天数是否为0，若为0，则不显示天数，否则替换@为d
      if (day) {
        return day + 'd ' + currentTime;
      }
      return currentTime;
    } else {
      // 绝对时间需要显示年月日
      return formatTime(dateTime, "YYYY-MM-DD HH:mm:ss.SSS");
    }
  }
}
